#include <cassert>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>

using namespace std;

const int MAXN=2500;
const int SIZE=55;
const int dx[]={0, 1, 0, -1};
const int dy[]={1, 0, -1, 0};

vector<int> G[MAXN];
char map[SIZE][SIZE];
int label[SIZE][SIZE];
int match[MAXN];
bool vis[MAXN];
int R, C, N, M;

bool Find(int u)
{
	for (int i=0; i<G[u].size(); i++)
	{
		int v=G[u][i];
		if (vis[v]) continue;
		vis[v]=true;
		if (match[v]==-1||Find(match[v]))
		{
			match[v]=u;
			return true;
		}
	}
	return false;
}

int main()
{
	while (scanf("%d%d", &R, &C)==2)
	{
		N=0, M=0;
		for (int i=0; i<R; i++)
		{
			scanf("%s", map[i]);
			for (int j=0; j<C; j++)
			{
				if (map[i][j]=='X') continue;
				if ((i^j)&1) label[i][j]=M++;
				else label[i][j]=N++;
			}
		}
		for (int i=0; i<N; i++) G[i].clear();
		for (int i=0; i<R; i++)
			for (int j=0; j<C; j++)
			{
				if (map[i][j]=='X'||((i^j)&1)) continue;
				for (int k=0; k<4; k++)
				{
					int xx=i+dx[k], yy=j+dy[k];
					if (xx<0||xx>=R||yy<0||yy>=C||map[xx][yy]=='X') continue;
					G[label[i][j]].push_back(label[xx][yy]);
				}
			}
		memset(match, -1, sizeof(match));
		int ret=0;
		for (int i=0; i<N; i++)
		{
			memset(vis, 0, sizeof(vis));
			if (Find(i)) ret++;
		}
		if (ret==N&&ret==M) puts("2");
		else puts("1");
	}
	return 0;
}
